package com.sunrise.crm.bean;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.annotation.Resource;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;

import lombok.Getter;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;
import org.springframework.stereotype.Controller;

import com.sunrise.configuracoes.visao.PessoaForm;
import com.sunrise.crm.servico.ManterPessoaService;
import com.sunrise.generico.bean.ManterBean;
import com.sunrise.generico.entidade.Cidade;
import com.sunrise.generico.entidade.Contato;
import com.sunrise.generico.entidade.Endereco;
import com.sunrise.generico.entidade.Estado;
import com.sunrise.generico.entidade.Pessoa;
import com.sunrise.generico.entidade.TipoPessoa;
import com.sunrise.generico.enums.TipoPessoaEnum;
import com.sunrise.generico.enums.TipoStatus;
import com.sunrise.generico.util.MessagesUtil;
import com.sunrise.generico.util.WebServiceCep;
import com.sunrise.generico.visao.Filtro;

@ManagedBean
@ViewScoped
@Controller
public class ManterPessoaBean extends ManterBean<Pessoa> {

	@Resource
	@Getter
	private ManterPessoaService pessoaService;

	@Resource
	@Getter
	private PessoaForm formulario;

	@Override
	public void inicializarEntidade() {
		setEntidade(new Pessoa());
		getEntidade().setTiposPessoa(new ArrayList<TipoPessoa>());
		if(getFiltro().getTipoPessoa() != null){
			getEntidade().getTiposPessoa().add(getPessoaService().buscarTipoPessoaPorNome(getFiltro().getTipoPessoa().getNome()));
		}
		getEntidade().setContato(new Contato());
		getEntidade().setEndereco(new Endereco());
		getEntidade().getEndereco().setCidade(new Cidade());
		getEntidade().getEndereco().getCidade().setEstado(new Estado());
		getEntidade().setAtivo(Boolean.TRUE);
		inicializarFormulario();
	}

	@Override
	public void preRenderList(ComponentSystemEvent event) {
		setStatus(Arrays.asList(TipoStatus.values()));
		setFiltro(new Filtro());
		getFiltro().setAtivo(getStatus().iterator().next());
		setEntidades(getPessoaService().listarOrdenado(getEntidade(), null));
		inicializarEntidade();
	}
	
	public void preRenderListCliente(ComponentSystemEvent event) {
		setStatus(Arrays.asList(TipoStatus.values()));
		setFiltro(new Filtro());
		getFiltro().setTipoPessoa(getPessoaService().buscarTipoPessoaPorNome(TipoPessoaEnum.CLIENTE.getLabel()));
		getFiltro().setAtivo(getStatus().iterator().next());
		setEntidades(getPessoaService().listarOrdenado(getEntidade(), getFiltro().getTipoPessoa().getNome()));
		inicializarEntidade();
	}
	
	public void preRenderListFornecedor(ComponentSystemEvent event) {
		setStatus(Arrays.asList(TipoStatus.values()));
		setFiltro(new Filtro());
		getFiltro().setTipoPessoa(getPessoaService().buscarTipoPessoaPorNome(TipoPessoaEnum.FORNECEDOR.getLabel()));
		getFiltro().setAtivo(getStatus().iterator().next());
		setEntidades(getPessoaService().listarOrdenado(getEntidade(), getFiltro().getTipoPessoa().getNome()));
		inicializarEntidade();
	}
	
	public void preRenderListTransportador(ComponentSystemEvent event) {
		setStatus(Arrays.asList(TipoStatus.values()));
		setFiltro(new Filtro());
		getFiltro().setTipoPessoa(getPessoaService().buscarTipoPessoaPorNome(TipoPessoaEnum.TRANSPORTADOR.getLabel()));
		getFiltro().setAtivo(getStatus().iterator().next());
		setEntidades(getPessoaService().listarOrdenado(getEntidade(), getFiltro().getTipoPessoa().getNome()));
		inicializarEntidade();
	}
	
	@Override
	public void preRenderEdit(ComponentSystemEvent event) {
		carregarEditar();
	}
	
	
	public void carregarEditar(){
		setEntidade(getPessoaService().buscarPessoaPorId(getEntidade().getId()));
		if (getEntidade().getContato() == null) {
			getEntidade().setContato(new Contato());
		}

		if (getEntidade().getEndereco() == null) {
			getEntidade().setEndereco(new Endereco());
			getEntidade().getEndereco().setCidade(new Cidade());
			getEntidade().getEndereco().getCidade().setEstado(new Estado());
		} else if (getEntidade().getEndereco().getCidade() == null) {
			getEntidade().getEndereco().setCidade(new Cidade());
			getEntidade().getEndereco().getCidade().setEstado(new Estado());
		} else if (getEntidade().getEndereco().getCidade().getEstado() == null) {
			getEntidade().getEndereco().getCidade().setEstado(new Estado());
		} else {
			carregarCidades();
		}

		inicializarFormulario();
	}

	private void inicializarFormulario() {
		getFormulario().setFisica(Boolean.TRUE);
		getFormulario().setEstados(getPessoaService().listarEstados());
		getFormulario().setTiposPessoa(getPessoaService().listarNaoUsuarios());
	}

	@Override
	public List<Pessoa> iniciarlizarListEntidade() {
		return new ArrayList<Pessoa>();
	}

	public String habilitar() {
		try {
			getEntidade().setAtivo(Boolean.TRUE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroHabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoHabilitado"));
			return null;
		}
	}

	public String desabilitar() {
		try {
			getEntidade().setAtivo(Boolean.FALSE);
			getService().alterar(getEntidade());
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroDesabilitadoSucesso"));
			buscarPorFiltros();
			return getListar();
		} catch (Exception e) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("registroNaoDesabilitado"));
			return null;
		}
	}

	public void buscarPorFiltros() {
		setEntidades(getPessoaService().buscarPorFiltros(getFiltro()));
	}

	public void consultarCep() {
		if (getEntidade().getEndereco().getCep() != null && !getEntidade().getEndereco().getCep().isEmpty()) {
			WebServiceCep cep = WebServiceCep.searchCep(getEntidade().getEndereco().getCep());
			if (cep != null) {
				getEntidade().getEndereco().setBairro(cep.getBairro());
				getEntidade().getEndereco().setEndereco(cep.getLogradouroType() + " " + cep.getLogradouro());
				getEntidade().getEndereco().setCidade(getPessoaService().buscarCidadePorNome(cep.getCidade()));
			}
			carregarCidades();
		}
	}

	@Override
	public String alterar() {
		getPessoaService().alterar(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("alteradoSucesso"));
		return getListar();
	}
	
	@Override
	public String salvar() {
		if (getEntidade().getTiposPessoa() == null || getEntidade().getTiposPessoa().isEmpty()) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("tipoPessoaObrigatorio"));
			return null;
		}
		getPessoaService().salvar(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
		buscarPorFiltros();
		return getListar();
	}
	
	@Override
	public String salvarContinuar() {
		if (getEntidade().getTiposPessoa() == null || getEntidade().getTiposPessoa().isEmpty()) {
			MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("tipoPessoaObrigatorio"));
			return null;
		}
		getPessoaService().salvar(getEntidade());
		MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("criadoSucesso"));
		return criarEntidade();
	}
	
	@Override
	public String getListar(){
		inicializarEntidade();
		FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);
		return "l" + getFiltro().getTipoPessoa().getNome() + ".xhtml?faces-redirect=true&amp;includeViewParams=true";
	}

	public void validarEmail() {
		if (getEntidade().getContato().getEmail() != null && !getEntidade().getContato().getEmail().isEmpty()) {
			Pattern p = Pattern.compile("^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\\.[a-zA-Z0-9-.]+$");
			Matcher m = p.matcher(getEntidade().getContato().getEmail());
			if (!m.matches()) {
				MessagesUtil.addNewInfoMessage(MessagesUtil.getMessageKey("emailInvalido"));
			}
		}
	}
	
	
	public void carregarCidades() {
		getFormulario().setCidades(
				getPessoaService().carregarCidadesPorEstado(getEntidade().getEndereco().getCidade().getEstado()));

	}
	
	
	public void uploadArquivo(FileUploadEvent fileUploadEvent){
		 UploadedFile uploadedFile = fileUploadEvent.getFile();  
		 uploadedFile.getContents();
         String fileNameUploaded = uploadedFile.getFileName(); 
         long fileSizeUploaded = uploadedFile.getSize();
	}

}
